package com.sh_rw.label.common.factory;


import com.sh_rw.label.common.parser.Parser;
import com.sh_rw.label.common.parser._18Parser;
import com.sh_rw.label.common.parser._19Parser;
import com.sh_rw.label.common.parser._20Parser;
import com.sh_rw.label.common.parser._30Parser;
import com.sh_rw.label.common.parser._BaseArgParser;
import com.sh_rw.label.common.parser._RFParser;
import com.sh_rw.label.common.parser._ReplyParser;

import java.util.HashMap;

/**
 * Created by rw-duke on 2018/4/4.
 */

public class ParserFactory {
    private static ParserFactory instance;
    /*解析器TAG*/
    public static final int PARSER_18_TYPE = 18;

    public static final int PARSER_19_TYPE = 19;
    public static final int PARSER_20_TYPE = 20;
    public static final int PARSER_30_TYPE = 30;
    public static final int PARSER_RF_TYPE = 31;
    public static final int PARSER_BASE_ARG_TYPE = 32;
    public static final int PARSER_REPLY_TYPE = 33;
//    public static final int PARSER_REPLY_TYPE = 33;

    private HashMap<Integer,Parser> mParserCache;
    private ParserFactory() {
        mParserCache = new HashMap<>();
    }

    public static ParserFactory get() {
        if (instance == null) {
            synchronized (ParserFactory.class) {
                if (instance == null) {
                    instance = new ParserFactory();
                }
            }
        }
        return instance;
    }


//    public Parser createParser(Class<? extends Parser> clazz) {
//        Parser parser = null;
//        parser = mParserCache.get(clazz.getName());
//        if (parser == null){
//            try {
//                parser = clazz.newInstance();
//            } catch (InstantiationException e) {
//                e.printStackTrace();
//            } catch (IllegalAccessException e) {
//                e.printStackTrace();
//            }
//        }
//
//        return parser;
//    }

    public Parser getParser(int parserTag){
        Parser parser = null;
        parser = mParserCache.get(parserTag);
        if (parser == null){
            switch (parserTag){
                case PARSER_18_TYPE:
                    parser = new _18Parser();
                    break;
                case PARSER_19_TYPE:
                    parser = new _19Parser();
                    break;
                case PARSER_20_TYPE:
                    parser = new _20Parser();
                    break;
                case PARSER_30_TYPE:
                    parser = new _30Parser();
                    break;
                case PARSER_RF_TYPE:
                    parser = new _RFParser();
                    break;
                case PARSER_BASE_ARG_TYPE:
                    parser = new _BaseArgParser();
                    break;
                case PARSER_REPLY_TYPE:
                    parser = new _ReplyParser();
                    break;
                default:
                    break;
            }
            mParserCache.put(parserTag,parser);
        }
        return parser;
    }

}
